﻿#define _CRT_SECURE_NO_WARNINGS  1
#pragma warning(disable:6031)

//自除数 是指可以被它包含的每一位数整除的数。
//
//例如，128 是一个 自除数 ，因为 128 % 1 == 0，128 % 2 == 0，128 % 8 == 0。
//自除数 不允许包含 0 。
//
//给定两个整数 left 和 right ，返回一个列表，列表的元素是范围 [left, right] 内所有的 自除数 。
//
//来源：力扣（LeetCode）
//链接：https ://leetcode.cn/problems/self-dividing-numbers
//著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

#include <stdio.h>
#include <stdlib.h>

int zero_(int num)
{
    do
    {
        if (num % 10 == 0)
        {
            return 1;
        }
    } while (num /= 10);
    return 0;
}

int* selfDividingNumbers(int left, int right, int* returnSize)
{
    int i = 0;
    int j = 0;
    int flag = 0;
    int num = 0;
    int count = 0;
    *returnSize = 0;
    int* arr = (int*)calloc(6561, sizeof(int));
    //题给数据的范围是1到10000，自除数的要求是不含0，9*9*9*9=6561,故申请6561字节的空间充足且保险

    for (i = left, j = 0; i <= right; i++, j++)
    {
        if (zero_(i))
        {
            continue;
        }

        num = i;
        flag = 0;
        do
        {
            if (i % (num % 10) != 0)
            {
                flag = 1;
                break;
            }
        } while (num /= 10);
        if (!flag)
        {
            arr[(*returnSize)++] = i;
        }
    }
    return arr;
}

int main()
{
    int l = 1;
    int r = 22;
    int a[1] = { 1 };
    int* arr = selfDividingNumbers(l, r, a);
    for (int i = 0; i < a[0]; i++)
    {
        printf("%d ", *(arr + i));
    }
    return 0;
}